package bz.ziro.kanbe.bean;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.google.appengine.api.datastore.Key;

import bz.ziro.kanbe.model.Page;

/**
 * ページツリー用データ
 * @author Administrator
 */
public class PageTreeData {

	/**
	 * 自分のページ情報
	 */
    private Page myPage;

    /**
     * 子ページリスト
     */
    private List<PageTreeData> pageList;

    /**
     * コンストラクタ
     */
    public PageTreeData() {
        pageList = new ArrayList<PageTreeData>();
    }

    /**
     * 子頁リストを再帰的に追加する
     * @param page
     * @param pageMap
     */
    public void setPageList(Page page,Map<Page,List<Page>> pageMap) {

        setPage(page);
        //自分の頁の子を取得
        List<Page> childList = pageMap.get(page);
        //子が存在しない場合
        if ( childList == null ) return;
        //子のリスト数回繰り返す
        for ( Page childPage : childList ) {
            //子用にインスタンスを生成する
        	PageTreeData obj = new PageTreeData();
            //子として追加
            pageList.add(obj);
            //子のオブジェクト(子供)を設定する
            obj.setPageList(childPage,pageMap);
        }
    }

    /**
     * ツリーデータを表示
     * @param buf
     */
    public void writeTree(StringBuffer buf) {
        writeTree(this,buf);
	}


    /**
     * @param myPage セットする myPage
     */
    public void setPage(Page myPage) {
        this.myPage = myPage;
    }
    /**
     * @param myPage セットする myPage
     */
    public Page getPage() {
        return this.myPage;
    }
    /**
     * @param myPage セットする myPage
     */
    public List<PageTreeData> getPageList() {
        return this.pageList;
    }
    

    /**
     * ツリー書き込み
     * @return ツリー用XMLデータ
     */
    public String getTree() {
        StringBuffer buf = new StringBuffer();
        //ツリーデータを取得
        writeTree(buf);
        return buf.toString();
    }

    /**
     * 頁データの作成
     * @param myPage2
     * @param buf
     */
    private void writeTree(PageTreeData aPage, StringBuffer buf) {

        //頁データを書き込み
        buf.append("<page " + getPageData(aPage.getPage()));

        List<PageTreeData> childList = aPage.getPageList();
        //子のオブジェクトが存在する場合
        if ( childList.size() > 0 ) {
            buf.append(">" + "\n" );
            //頁数回繰り返す
            for ( PageTreeData page : childList ) {
                //再帰で呼び出す
                writeTree(page,buf);
            }
            buf.append("</page>" + "\n" );
        } else {
            buf.append("/>" + "\n" );
        }
    }

    /**
     * 頁のラインデータを取得
     * @param aPage
     * @return
     */
    private String getPageData(Page aPage) {

        Key key = aPage.getParentPageKey();

        //頁用のラインデータを作成
        String line =  "name=\"" + aPage.getName() + "\" " +
                       "key=\"" + aPage.getKey().getId() + "\"";
        String parent = "false";
        if ( key == null ) {
            parent = "true";
        }
        line += (" parent=\"" + parent + "\"");
        return line;
    }
    

}
